В Эликсире процессы по умолчанию кратковременны; как только функция завершается, процесс прекращает работу. Чтобы создать долговременный, состоящий процесс, мы используем рекурсию, чтобы поддерживать процесс в цикле.
1. Оптимизация хвостовых вызовов (TCO)
Если абсолютное последнее действие функции — это вызов самой себя, виртуальная машина Эрланга (BEAM) выполняет Оптимизацию хвостовых вызовов. Вместо добавления нового фрейма в стек он просто перепрыгивает обратно к началу функции с новыми аргументами.
def factorial(n, acc), do: _fact(n-1, acc*n) # TCO
def factorial(n), do: n * factorial(n-1) # НЕ TCO
def factorial(n), do: n * factorial(n-1) # НЕ TCO
2. Долговременное состояние
Состояние поддерживается передачей обновленных значений в качестве аргументов рекурсивному вызову. Благодаря оптимизации хвостовых вызовов эти аргументы заменяют исходные параметры в стеке без дополнительного потребления памяти, что позволяет циклам работать бесконечно.
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>